package com.heepay;


import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.JsonNode;

import com.heepay.common.HttpUtil;
import com.heepay.common.MyKey;
import com.heepay.common.SignEncrypt;
import org.bouncycastle.util.encoders.Base64;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

import static com.heepay.common.HttpUtil.parseJsonResponse;


/**
快捷收银台接口，非快捷网关体系内
*/

public class CashierApi {


    public static void main(String[] args) throws Exception {

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date now = new Date();
        String time = sdf.format(now);
        // 创建Random对象
        Random random = new Random();
        // 设置上限值
        int upperBound = 1000000000;
        // 生成随机数
        String randomNum = String.valueOf(random.nextInt(upperBound));


        String method = "heepay.bank.apply.page.pay";
        String version ="1.0";
        String sign_type = "RSA1";
        String pay_type = "63";
        //请求商户ID
        String merch_id = "1664502";
        String timestamp = time;
        String out_trade_time = time;
        String out_trade_no = randomNum;
        //异步返回的商户处理页面，URL参数是以http://或https://开头的完整URL地址(后台处理)，提交的url地址必须外网能访问到，否则无法通知商户。值可以为空，但不可以为null
        String notify_url = "https://www.baidu.com/";
        String return_url = "https://www.baidu.com/";
        //商户平台用户唯一标识，自定义，一定要唯一
        String merch_user_id = "";
        //商户平台商品名称 | 编码格式：utf-8
        String goods_name = "米饭";
        //支付金额 | 单位：元，支持小数点后两位
        double pay_amt = 0.01;



        /* 业务参数注意
           如果是大商户子商户模式，需要传子商户号，如果需要订单分润需要传is_profit_sharing
           并且需要放在biz里面去组装
            子商户号*/
        //String sub_merch_id ="";
        //是否指定分账 | 枚举值 true：是 false：否   传 1 或 2
        int is_profit_sharing = 1;



        //biz组装
        JSONObject payer_info = new JSONObject();
        payer_info.put("merch_user_id",merch_user_id);
        JSONObject goods_info = new JSONObject();
        goods_info.put("goods_name",goods_name);
        JSONObject biz_content = new JSONObject();
        biz_content.put("out_trade_no",out_trade_no);
        biz_content.put("out_trade_time",out_trade_time);
        biz_content.put("pay_type",pay_type);

        /* 业务参数注意
           如果是大商户子商户模式，需要传子商户号，如果需要订单分润需要传is_profit_sharing
           并且需要放在biz里面去组装
            子商户号*/
        //biz_content.put("sub_merch_id",sub_merch_id);
        biz_content.put("is_profit_sharing",is_profit_sharing);
        biz_content.put("pay_amt",pay_amt);
        biz_content.put("return_url",return_url);
        biz_content.put("notify_url",notify_url);
        biz_content.put("payer_info",payer_info);
        biz_content.put("goods_info",goods_info);
        System.out.println("加密串：--------->"+biz_content);


        //签名串组装
        String OldSign = "biz_content=" + biz_content
                + "&merch_id=" + merch_id
                +"&method=" + method
                +"&sign_type=" + sign_type
                +"&timestamp=" + timestamp
                +"&version=" + version;

        System.out.println("签名串：--------->"+OldSign);

        SignEncrypt signEncrypt = new SignEncrypt();

        // 使用类名和常量名来访问常量
        String publicKeystr = MyKey.publicKeystr;
        String privateKeystr = MyKey.privateKeystr;
        //密钥配置
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        byte[] publicKeyPath = Base64.decode(publicKeystr.getBytes());
        byte[] privateKeyPath = Base64.decode(privateKeystr.getBytes());
        PublicKey heepayPublicKey = keyFactory.generatePublic(new X509EncodedKeySpec(publicKeyPath));
        PrivateKey privateKey = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(privateKeyPath));
        //加密
        String content = signEncrypt.encrypt(String.valueOf(biz_content), heepayPublicKey);
        //加签
        String sign = signEncrypt.sign(OldSign, privateKey);


        //最终请求数据
        JSONObject param = new JSONObject();
        param.put("method",method);
        param.put("version",version);
        param.put("merch_id",merch_id);
        param.put("timestamp",timestamp);
        param.put("biz_content",content);
        param.put("sign_type",sign_type);
        param.put("sign",sign);

        HttpUtil httpUtil = new HttpUtil();
        String a = httpUtil.sendJsonHttpPost("https://sign.Heepay.com/API/Cashier/ApplyPay.aspx", String.valueOf(param));
        //解析返回参数
        JsonNode jsonNode = parseJsonResponse(a);
        String msg = jsonNode.get("msg").asText();


        if ( "调用成功".equals(msg) ){
            String data = jsonNode.get("data").asText();
            String DecryptedData = signEncrypt.decrypt(data,privateKey);
            JsonNode DecryptedData1 = parseJsonResponse(DecryptedData);
            String redirect_uri = DecryptedData1.get("redirect_uri").asText();
            System.out.println("输出为收银台请求地址：--------->"+redirect_uri);
        }else {
            String sub_msg = jsonNode.get("sub_msg").asText();
            System.out.println("输出失败sub_msg：--------->"+sub_msg);
        }
    }
}
